﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Input;
using System.Windows.Markup;

namespace GenericWin
{
    /// <summary>
    /// This is an extremely basic class for representing menu items with associated images
    /// and commands.  I've only implemented property-change notification on the properties
    /// that actually get changed by the application.
    /// </summary>
    [ContentProperty("Children")]
    public class MenuItemViewModel : INotifyPropertyChanged
    {
        #region Attribut(s)

        /// <summary>
        /// Command sur cet élément
        /// </summary>
        private ICommand _Command;

        /// <summary>
        /// L'Uri de l'icon de l'élément
        /// </summary>
        private Uri _ImageSource;

        /// <summary>
        /// Margin de l'image si une image est uploadé sur l'item
        /// </summary>
        private Thickness _MarginImg;

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Propriété(s)

        /// <summary>
        /// Element fils de cet élement (Pattern composite)
        /// </summary>
        public ObservableCollection<MenuItemViewModel> Children { get; set; }

        /// <summary>
        /// Command (clic) sur l'élément
        /// </summary>
        public ICommand Command
        {
            get
            {
                return _Command;
            }
            set
            {
                _Command = value;
                OnPropertyChanged("Command");
            }
        }

        /// <summary>
        /// L'Uri de l'icon de l'élément
        /// </summary>
        public Uri ImageSource
        {
            get
            {
                return _ImageSource;
            }
            set
            {
                _ImageSource = value;
                OnPropertyChanged("ImageSource");
                MarginImg = new Thickness(0, 0, 3, 0);
            }
        }

        /// <summary>
        /// Margin de l'image si une image est uploadé sur l'item
        /// </summary>
        public Thickness MarginImg
        {
            get
            {
                return _MarginImg;
            }
            set
            {
                _MarginImg = value;
                OnPropertyChanged("MarginImg");
            }
        }

        /// <summary>
        /// Texte de l'élément
        /// </summary>
        public String Text { get; set; }

        /// <summary>
        /// ID de l'élément
        /// </summary>
        public String Id
        {
            get;
            private set;
        }

        /// <summary>
        /// Titre de l'écran que va ouvrir cet élément du menu
        /// </summary>
        public String TitreEcran
        {
            get;
            set;
        }
        #endregion

        #region Constructeur(s)

        /// <summary>
        /// Constructeur vide
        /// </summary>
        public MenuItemViewModel()
        {
            Children = new ObservableCollection<MenuItemViewModel>();
            MarginImg = new Thickness(0, 0, 0, 0);
        }

        /// <summary>
        /// Constructeur avec paramètres
        /// </summary>
        /// <param name="id">ID unique de l'élément</param>
        /// <param name="text">Texte affiché dans l'item du menu</param>
        public MenuItemViewModel(String id, String text)
            : this(id, text, null)
        {
        }

        /// <summary>
        /// Constructeur avec paramètres. 
        /// L'ID est initialisé avec le texte passé en paramètre.
        /// </summary>
        /// <param name="text">Texte affiché dans l'item du menu</param>
        public MenuItemViewModel(String text)
            : this(text, text, null)
        {
        }

        /// <summary>
        /// Constructeur avec paramètres
        /// </summary>
        /// <param name="id">ID unique de l'élément</param>
        /// <param name="text">Texte de l'élément menu</param>
        /// <param name="uriImg">Icon de l'élément</param>
        public MenuItemViewModel(String id, String text, Uri uriImg)
            : this(id, text, uriImg, text)
        {
        }

        /// <summary>
        /// Constructeur avec paramètres
        /// </summary>
        /// <param name="id">ID unique de l'élément</param>
        /// <param name="text">Texte affiché dans l'item du menu</param>
        /// <param name="uriImg">Icon de l'élément</param>
        /// <param name="titreEcran">Titre de l'écran (affiché sur le control)</param>
        public MenuItemViewModel(String id, String text, Uri uriImg, String titreEcran)
            : this()
        {
            Id = id;
            Text = text;
            ImageSource = uriImg;
            TitreEcran = titreEcran;
        }

        
        #endregion

        #region Méthode(s)

        private void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler h = PropertyChanged;
            if (h != null)
            {
                h(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion  
    }
}
